package mongodb

import (
	"BJXM_Shooting/conf"
	"context"
	"github.com/name5566/leaf/log"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

var (
	database     *mongo.Database
	Set          map[string]*mongo.Collection
	MongoContext context.Context
)

// 集合的名字
const (
	XM_USERS = "xm_users"
)

// 初始化
func Init() {
	// 创建连接条件
	ops := options.ClientOptions{}
	ops.ApplyURI(conf.CustomConfig.MongoDB.URL)
	if conf.CustomConfig.MongoDB.UseAuth {
		ops.SetAuth(options.Credential{
			AuthMechanism: conf.CustomConfig.MongoDB.AuthMeshanism,
			AuthSource:    conf.CustomConfig.MongoDB.DBName,
			Username:      conf.CustomConfig.MongoDB.Account,
			Password:      conf.CustomConfig.MongoDB.Password,
		})
	}

	// 获取统一上下文
	MongoContext = context.Background()
	// 连接到数据库服务器
	client, err := mongo.Connect(MongoContext, &ops)
	if err != nil {
		log.Fatal("连接数据库服务器失败:%s", err.Error())
	}
	// 获取指定数据库对象
	database = client.Database(conf.CustomConfig.MongoDB.DBName)
	if database == nil {
		log.Fatal("获取指定数据库对象失败!")
	}

	// 初始化集合
	// 从数据库里获取所有集合名称,然后赋能给map管理
	Set = make(map[string]*mongo.Collection)
	// 取所有集合
	cur, err := database.ListCollections(MongoContext, bson.M{})
	if err != nil {
		log.Fatal("[数据库]获取所有集合失败:%s", err.Error())
	}
	defer cur.Close(MongoContext)

	// MongoDB集合的结构体,我们这里只需要取出name就够了
	type collection struct {
		Name string
	}
	// 赋能给map
	for cur.Next(MongoContext) {
		var name collection
		if err := cur.Decode(&name); err == nil {
			Set[name.Name] = database.Collection(name.Name)
			if Set[name.Name] == nil {
				log.Fatal("[数据库]连接集合:%s失败", name.Name)
			}
		}
	}
	log.Debug("读取数据库完成")
}
